package com.dhcc.utils;

import com.dhcc.entity.SysResource;
import com.dhcc.response.SysResourceListTree;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * 资源树构建工具类
 * @ProjectName Dhcc-Cloud
 * @PackageName com.dhcc.utils
 * @Title ResourceTreeBuilder
 * @Date 2025/1/7 下午12:45
 * @Author LiuGuoting
 */
public class ResourceTreeBuilder {

    /**
     * 构建资源树
     *
     * @param allResources 所有资源列表（原始 SysResource 列表）
     * @param parentId     父资源 ID，根资源为 null
     * @return 资源树
     */
    public static List<SysResourceListTree> buildResourceTree(List<SysResource> allResources, String parentId) {
        // 将 SysResource 转换为 SysResourceVO
        List<SysResourceListTree> allResourceVOs = convertToResourceVOList(allResources);

        // 使用转换后的 VO 列表递归构建树
        return buildTreeFromVO(allResourceVOs, parentId);
    }

    /**
     * 将 List<SysResource> 转换为 List<SysResourceVO>
     *
     * @param allResources 原始资源列表
     * @return 转换后的资源 VO 列表
     */
    private static List<SysResourceListTree> convertToResourceVOList(List<SysResource> allResources) {
        List<SysResourceListTree> voList = new ArrayList<>();
        for (SysResource resource : allResources) {
            voList.add(convertToVO(resource));
        }
        return voList;
    }

    /**
     * 构建资源树（直接操作 SysResourceVO 列表）
     *
     * @param allResources 所有资源 VO 列表
     * @param parentId     父资源 ID，根资源为 null
     * @return 资源树
     */
    public static List<SysResourceListTree> buildTreeFromVO(List<SysResourceListTree> allResources, String parentId) {
        List<SysResourceListTree> tree = new ArrayList<>();
        for (SysResourceListTree resource : allResources) {
            // 判断当前资源是否属于指定父资源
            if (Objects.equals(resource.getResourceParentId(), parentId)) {
                // 递归设置子资源
                resource.setChildren(buildTreeFromVO(allResources, resource.getId()));
                tree.add(resource);
            }
        }
        return tree;
    }

    /**
     * 将 SysResource 转换为 SysResourceVO
     *
     * @param resource SysResource 实体
     * @return SysResourceVO 对象
     */
    public static SysResourceListTree convertToVO(SysResource resource) {
        SysResourceListTree vo = new SysResourceListTree();
        BeanUtils.copyProperties(resource, vo);
        return vo;
    }
}
